package com.skt.common_hr.work_nos.model
{
	import com.wcl.utils.DateUtil;
	
	public class CalcOvertime
	{
		static private var OT_START:int = 19;
		static private var OT_END:int = 6;
		static private var NIGHT_START:int = 22
		static private var NIGHT_END:int = 6;



		static public function morningtime(begin:Date, end:Date):Number
		{
			var morning:Date = new Date(begin);
			morning.hours = 9;
			morning.minutes = 0;
			
			if(Number(morning)<Number(end)) {
				return (Number(morning) - Number(begin))/(1000*60*60);
			}
			else {
				return (Number(end) - Number(begin))/(1000*60*60);
			}
		}
		
		static public function diffTime(begin:Date, end:Date):Number
		{
			var retValue:Number = (Number(end) - Number(begin))/(1000*60*60);
			if(retValue < 0) retValue = 0;  
			return retValue;
		}

		static public function ruled_diffTime(begin:Date, end:Date):Number
		{
			var retTime:Number = 0;
			
			retTime = (Number(end) - Number(begin))/(1000*60*60);
			//trace("차감전 : " + retTime + ", " + (int(retTime/4)+((retTime%4)>0?1:0))*.5);
			retTime = retTime - int(retTime/4)*.5 +((retTime%4)==0?1:0)*.5; 
			//trace("차감후 : " + retTime);
			return retTime;
		}
		
		/**
		 * 휴일 --> 평일 이면서 8시간 1시간으로 제한을 두었을때 (평일 근무시간, 단기파견직)
		 */
		static public function ruled_diffTimeNot8LimitToNextHoliToNormal(begin:Date, end:Date, bEndTimeNextDay:Boolean):Number
		{
			
			if(bEndTimeNextDay==true) {
				begin.date++ ;
				begin.hours = 00;	
			}
			
			var retTime:Number = 0;			
			retTime = (Number(end) - Number(begin))/(1000*60*60);
			
			if(retTime > 4 && retTime <= 8) {
				 retTime = retTime - 0.5;	
			} else if(retTime > 8) {
				retTime = retTime - 1;
			}
			
			return retTime;
		}
		
		// 다음날이 휴일이면서 8시간 1시간으로 제한을 두었을때 (평일 근무시간, 단기파견직)
		static public function ruled_diffTimeNot8LimitToNextHoli(begin:Date, end:Date, bEndTimeNextDay:Boolean):Number
		{
			
			if(bEndTimeNextDay==true) {
				end.date-- ;
				end.hours = 24;	
			}
			
			var retTime:Number = 0;			
			retTime = (Number(end) - Number(begin))/(1000*60*60);
			
			if(retTime > 4 && retTime <= 8) {
				 retTime = retTime - 0.5;	
			} else if(retTime > 8) {
				retTime = retTime - 1;
			}
			
			return retTime;
		}
		
		static public function ruled_diffTimeNot8Limit(begin:Date, end:Date):Number
		{
			var retTime:Number = 0;
			
			retTime = (Number(end) - Number(begin))/(1000*60*60);
			
			if(retTime > 4 && retTime <= 8) {
				 retTime = retTime - 0.5;	
			} else if(retTime > 8) {
				retTime = retTime - 1;
			}
			
			return retTime;
		}
		
		static public function overtime(begin:Date, end:Date):Number
		{
			var retTime:Number = 0;

			// Date 변경이 발생하므로 다른 객체로 변경한다.
			begin = new Date(begin);
			end = new Date(end);
			
			// 시작시간이나 종료시간이 기준시간보다 작은 경우는 다음날로 가정
			if(begin.hours<=6) begin.date++;
			if((end.hours<=8||(end.hours==9&&end.minutes==0))) end.date++;
			trace("begin: " + DateUtil.toBasicTimeString(begin) + ", end: " + DateUtil.toBasicTimeString(end) );
			// 종료시간이 시작시간을 앞서있을 경우 계산 안함
			if(Number(begin) < Number(end)) {
				retTime = (Number(end) - Number(begin))/(1000*60*60);
				trace("차감전 : " + retTime + ", " + (int(retTime/4)+((retTime%4)>0?1:0))*.5);
				retTime = retTime - int(retTime/4)*.5 +((retTime%4)==0?1:0)*.5; 
				trace("차감후 : " + retTime);
			}
			return retTime;
			
			
		}
		//2011.2.16 고도화 요청
		// 파견직 평일  OT
		static public function overtime_50(begin:Date, end:Date, bNextDayHoli:Boolean=false):Number
		{
			var retTime:Number = 0;

			// Date 변경이 발생하므로 다른 객체로 변경한다.
			begin = new Date(begin);
			end = new Date(end);
			
			end.fullYear = begin.fullYear;
			end.month = begin.month;
			end.date = begin.date;
			begin.seconds = end.seconds = begin.milliseconds = end.milliseconds = 0;

			// 시작시간이나 종료시간이 기준시간보다 작은 경우는 다음날로 가정
			if(begin.hours<=6) begin.date++;
			// 종료시간이 다음날인 경우
			if((end.hours<=8||(end.hours==9&&end.minutes==0))) {
				end.date++;
				if(bNextDayHoli) {	//다음날이 휴일이면 0시까지만 계산한다.
					end.hours = 0;
					end.minutes = 0;
				}
			}
			
			trace("begin: " + DateUtil.toBasicTimeString(begin) + ", end: " + DateUtil.toBasicTimeString(end) );
			// 종료시간이 시작시간을 앞서있을 경우 계산 안함
			if(Number(begin) < Number(end)) {
				retTime = (Number(end) - Number(begin))/(1000*60*60);
				trace("차감전 : " + retTime + ", " + (int(retTime/4)+((retTime%4)>0?1:0))*.5);
				//retTime = retTime - int(retTime/4)*.5 +((retTime%4)==0?1:0)*.5; 
				trace("차감후 : " + retTime);
			}
			return retTime;
			
			
		}

		/*	2010.10.20 반올림을 없애고 30분단위로 계산 로직을 변경
		static public function overtime(begin:Date, end:Date):Number
		{
			var retTime:Number = 0;

			// Date 변경이 발생하므로 다른 객체로 변경한다.
			begin = new Date(begin);
			end = new Date(end);
			
			end.fullYear = begin.fullYear;
			end.month = begin.month;
			end.date = begin.date;
			begin.seconds = end.seconds = begin.milliseconds = end.milliseconds = 0;

			// 시작시간이나 종료시간이 기준시간보다 작은 경우는 다음날로 가정
			if(begin.hours<=6) begin.date++;
			if((end.hours<=8||(end.hours==9&&end.minutes==0))) end.date++;
			trace("begin: " + DateUtil.toBasicTimeString(begin) + ", end: " + DateUtil.toBasicTimeString(end) );
			// 종료시간이 시작시간을 앞서있을 경우 계산 안함
			if(Number(begin) < Number(end)) {
				retTime = (Number(end) - Number(begin))/(1000*60*60);
				trace("차감전 : " + retTime + ", " + (int(retTime/4)+((retTime%4)>0?1:0))*.5);
				retTime = Math.round(retTime - (int(retTime/4)+((retTime%4)>0?1:0))*.5); 
				trace("차감후 : " + retTime);
			}
			return retTime;
			
			
		}
		*/
		static public function nighttime(begin:Date, end:Date, beginNextDay:Boolean, endNextDay:Boolean, ref_e:int=6, type:String=""):Number
		{
			var retTime:Number = 0;

			// Date 변경이 발생하므로 다른 객체로 변경한다.
			begin = new Date(begin);
			end = new Date(end);
			
			// 왜 end를 begin과 같이 마추는지 이해안감.
//			end.fullYear = begin.fullYear;
//			end.month = begin.month;
//			end.date = begin.date;
			begin.seconds = end.seconds = begin.milliseconds = end.milliseconds = 0;

			// 시작시간이나 종료시간이 기준시간보다 작은 경우는 다음날로 가정
   		
			//org	
 			
//			
//			if(  (begin.hours ==0 && begin.minutes == 0)  || begin.hours<9) { // 익일로 시작할경우는...9시 이전이다.
//				//begin.date++;
//			}
			
			// 2012 1022
			//if(beginNextDay == true) {
			if(beginNextDay == true) {
				
			}
			else {
	 			// silver
	 			// 휴일-->평일일 경우에 24부터 계산함. 
	 			if(type=="NH") {
		  			if(begin.hours<=24) {  
						begin.hours = 24;
						begin.minutes = 0;
					} 				
	 			} 
	 			// 휴일심야에 휴일심야를 구할때만 적용됨.
	 			else if(type=="HN,NH") {
		  			if(begin.hours<=24) {  
						begin.hours = 24;
						begin.minutes = 0;
					} 				
	 			}
	 			// 0401 새로 추가됨.
	 			// 정규직이면서 
	 			else if(type=="HN,NH") {
		  			if(begin.hours<=24) {  
						begin.hours = 24;
						begin.minutes = 0;
					} 				
	 			} 			
	 			// 기존 로직 그대로..
	 			else {
		  			if(begin.hours<22) {
		  				// silver 0620
		  				// silver0318 단기파견직이나 파견직은 06:00까지로 설정한다.  
/* 		  				if (persk=="50" || persk=="60") {
		  					begin.hours = 18;	
		  				} else {
		  					begin.hours = 22;
		  				} */
						begin.hours = 22;
						begin.minutes = 0;
					} 			 				
	 			}
			}

			// 익일로 넘어갔다면 ref_e시간까지 인정함.  			
			if(end.hours<9 || (end.hours==9 && end.minutes==0) ) {
				
				// 0405 silver
				// 익일 체크 불가로 추가 변수로 체크함.
				if(endNextDay == true) {
					// 20121022 
					if(type=="HN,NH" || type=="NH" ) {
						end.date++;	
					}
																			
					if(end.hours>=ref_e) {
						end.hours = ref_e;
						end.minutes = 0;
					} 					
				}
			}
			  
			  
			 
			// 종료시간이 시작시간을 앞서있을 경우 계산 안함
			if(Number(begin) < Number(end)) {
				retTime = (Number(end) - Number(begin))/(1000*60*60);
			}

			return retTime;
			
			
		}

		static public function calcOverTime(begin:Date, end:Date, ref_b:int, ref_e:int):Number
		{
			var retTime:Number = 0;
			
			// 기준시간으로 Date객체를 생성
			var refBegin:Date = new Date(begin);
			refBegin.hours = ref_b;
			refBegin.minutes = refBegin.seconds = refBegin.milliseconds = 0;
			var refEnd:Date = new Date(begin);
			refEnd.hours = ref_e;
			refEnd.minutes = refEnd.seconds = refEnd.milliseconds = 0;
			// 기준 종료시간이 시작시간보다 작은 경우는 종료일자를 하나  증가시킨다.
			if(ref_b>ref_e) {
				refEnd.date++;
			}
			
			// Date 변경이 발생하므로 다른 객체로 변경한다.
			begin = new Date(begin);
			end = new Date(end);
			
			end.fullYear = begin.fullYear;
			end.month = begin.month;
			end.date = begin.date;
			begin.seconds = end.seconds = begin.milliseconds = end.milliseconds = 0;
			
			// 시작시간이나 종료시간이 기준시간보다 작은 경우는 다음날로 가정
			if(begin.hours<=ref_e) begin.date++;
			if(end.hours<=ref_e) end.date++;

			// 종료시간이 시작시간을 앞서있을 경우 계산 안함
			if(Number(begin) < Number(end)) {
				var s:Date;
				var e:Date;
				if( Number(begin)>Number(refBegin)) s = begin;
				else s = refBegin;

				if( Number(end)>Number(refEnd)) e=refEnd;
				else e=end;
				
				// OT 시간 계산
				retTime = (Number(e) - Number(s))/(1000*60*60);
				retTime = Math.round(retTime*100)/100;
				if(retTime < 0) retTime = 0;
			}
			return retTime;
			
		}
		
	}
}